#include<iostream>
#include<fcntl.h>
#include<sys/types.h>
#include<cstring>
#include<cstdio>
#include<cerrno>
#include<unistd.h>
////////////////////////////////////////////////////////////////////////





int main(){
    //打开文件
    ssize_t fd = open("test.txt",O_CREAT|O_RDWR|O_TRUNC,0666);
    if(fd > 0){//返回值为文件描述符，失败返回-1并设置errno
        std::cout<<"文件描述符为："<<fd<<std::endl;
    }
    else{
        std::cerr<<"open error:"<<strerror(errno)<<std::endl;
        exit(1);
    }


//////////////////////////////////////////////////////////////////////////


    //向文件写入
    const char* c = "hello world!\n";
    ssize_t s = write(fd,c,strlen(c) + 1);
    if(s > 0){//返回值为实际写入字节数，失败返回-1并设置errno
        std::cout<<"写入字数为："<<s<<std::endl;
    }
    else{
        std::cerr<<"write error:"<<strerror(errno)<<std::endl;
        exit(2);
    }


//////////////////////////////////////////////////////////////////////////


    //文件重定位
    off_t off = lseek(fd,0,SEEK_SET);
    if(off < 0){//返回值为新的文件偏移量，失败返回-1并设置errno
        std::cout<<"lseek error:"<<strerror(errno)<<std::endl;
        exit(3);
    }
    else{
        std::cout<<"偏移量为："<<off<<std::endl;
    }


///////////////////////////////////////////////////////////////////////////


    //文件读取
    char buffer[1024];
    ssize_t n = read(fd,buffer,sizeof(buffer) - 1);
    buffer[n] = 0;//字符串结尾加上\0因为read不会自动加上\0
    if(n > 0){//返回值为实际读取字节数，失败返回-1并设置errno
        std::cout<<"实际读取字节数："<<n<<std::endl;
    }
    else{
        std::cerr<<"read error:"<<strerror(errno)<<std::endl;
        exit(4);
    }
    printf("%s",buffer);


//////////////////////////////////////////////////////////////////////////


    //关闭文件
    close(fd);
    return 0;
}